home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 095 / 131aobj.arc / XMODEM.ASM < prev    next >
Assembly Source File  |  1985-09-14  |  3KB  |  86 lines

  1. ; Modified 8/24/85 for use with QuickBasic Compiler
  2.  
  3. XM_CALC   SEGMENT PUBLIC 'CODESG'
  4.           ASSUME CS:XM_CALC
  5.           PUBLIC XMODEM
  6. ;
  7. CHK_SUM           DB 0
  8. CRC_VAL           DW 0                  ;CRC VARIABLE
  9. STRG_LEN          DW 0                  ;CHANGED TO LENGTH OF STRING PASSED
  10. STRG_LOC          DW 0
  11. STRG_MSG          DB 255 DUP (' ')      ;COMMAND CHARS (+CR) GO INTO HERE
  12. ;
  13. ;
  14. CRC_CALC  PROC                 ;AT TIME OF CALL:
  15.           MOV     CX,0008H     ;  AL=CHARACTER
  16.           MOV     BX,CRC_VAL
  17. LOOP0:
  18.           SHL     AL,1
  19.           RCL     BX,1
  20.           JNC     LOOP1
  21.           XOR     BX,1021H
  22. LOOP1:
  23.           LOOP    LOOP0
  24.           MOV     CRC_VAL,BX
  25.           RET
  26. CRC_CALC  ENDP
  27. ;
  28. ;
  29. XMODEM    PROC    FAR
  30.           PUSH    BP
  31.           MOV     BP,SP
  32.           MOV     CHK_SUM,0         ;INITIALIZE
  33.           MOV     CRC_VAL,0
  34. ;
  35.           MOV     SI,[BP+14]        ;GET STRING DESCRIPTOR
  36.           MOV     BL,[SI+ 2]        ;REARRANGE LOW/HIGH BYTES
  37.           MOV     BH,[SI+ 3]        ;NOW BX HOLDS THE ADDRESS OF THE STRING
  38.           MOV     STRG_LOC,BX       ;STORE IT
  39.           MOV     AX,[SI]           ;GET STRING LENGTH
  40.           MOV     STRG_LEN,AX       ;STORE IT
  41. ;
  42.           MOV     CX,STRG_LEN           ;STORE LENGTH IN CX
  43.           MOV     SI,STRG_LOC           ;STORE OFFSET TO STRING IN SI
  44.           PUSH    CS
  45.           POP     ES
  46.           MOV     DI,OFFSET STRG_MSG    ;ES:DI = LOCATION OF VARIABLE
  47.           REP     MOVSB                 ;FILL STRG_MSG WITH STRING
  48. ;
  49.           PUSH    DS                    ;SAVE DS
  50.           PUSH    CS
  51.           POP     DS
  52.           MOV     CX,0                  ;INITIALIZE COUNTER TO 0
  53. LOOP:
  54.           MOV     BX,OFFSET STRG_MSG
  55.           ADD     BX,CX
  56.           PUSH    CX                    ;SAVE CX
  57.           MOV     AL,[BX]
  58.           ADD     AL,CHK_SUM            ;ADD AL TO CHK_SUM
  59.           MOV     CHK_SUM,AL
  60.           MOV     AL,[BX]               ;SET AL TO CHARACTER BEFORE CALL
  61.           CALL    CRC_CALC              ;CALL CRC CALC
  62.           POP     CX                    ;RESTORE CX
  63.           INC     CX                    ;INCREMENT COUNTER
  64.           CMP     CX,STRG_LEN
  65.           JL      LOOP                  ;LOOP UNTIL ALL CHARS PROCESSED
  66. ;
  67.           POP     DS                   ;RESTORE DS
  68.           MOV     BX,CS:CRC_VAL        ;PASS BACK THE CRC VALUE
  69.           MOV     SI,[BP+ 6]           ;AND CRC HIGH AND LOW BYTES
  70.           MOV     [SI],BL
  71.           MOV     SI,[BP+ 8]
  72.           MOV     [SI],BH
  73.           MOV     SI,[BP+10]
  74.           MOV     [SI],BX
  75.           MOV     BL,CS:CHK_SUM        ;PASS BACK THE CHECK SUM
  76.           MOV     SI,[BP+12]
  77.           MOV     [SI],BL
  78. ;
  79.           PUSH    CS                ;CLEAN UP WORK TO RETURN TO BASIC
  80.           POP     ES
  81.           POP     BP
  82.           RET     10
  83. XMODEM    ENDP
  84. XM_CALC   ENDS
  85.           END
  86.